#include <vector>
#include <stack>
#include <string>
#include <iostream>
#include <iostream>     // std::cout, std::cin
#include <algorithm>    // std::sort
#include <vector>
#include "grafo.h"

using namespace std;

Vertice* Arista::getDstVertice()
  {
    return dstVertice;
  }

Vertice* Arista::getOrgVertice()
  {
    return orgVertice;
  }

unsigned Arista::getCosto()
  {
    return costo;
  }
  
enum Status Vertice::getStatus()
  {
    return status;
  }

void Vertice::setStatus(enum Status st)
  {
    status = st;
  }

string Vertice::getName()
  {
    return name;
  }

void Vertice::addAdjVertice(Vertice *adj, float costo)
  {
    Arista newArista(this, adj, costo);
    adjVerticeList.push_back(newArista);
    adj->adjVerticeList.push_back(newArista);
  }

vector<Arista>& Vertice::getAdjVerticeList()
  {
    return adjVerticeList;
  }

void Vertice::displayList()
  {
    string edgeOp = " <--> " ;
    for(int i=0 ; i < adjVerticeList.size() ; i++)
    {
      Arista edg = adjVerticeList[i];
      cout << edg.getOrgVertice()->getName() << " <--> " << edg.getDstVertice()->getName() << " peso: "<< edg.getCosto() << endl ;
    }

  }

void Vertice::EliminarAristaConVertice(Vertice verAdyacente)
{
  //implementar!
}
  
void Grafo::borrarVisitados() 
  {
    for(int i = 0; i < nodoList.size() ; i++)
    {
      nodoList[i]->setStatus(NOT_VISITED);
    }
  }

void Grafo::agregarVertice(Vertice *nVertice)
  {
    nodoList.push_back(nVertice);
  }

Vertice* Grafo::buscarVerticePorNombre(string name)
  {
    for(int i = 0 ; i < nodoList.size() ; i++)
    {
      if(nodoList[i]->getName() == name)
	return nodoList[i];
    }
    return NULL;
  }
   
void Grafo::mostrarGrafo()
  {
  for(int i=0 ; i < nodoList.size() ; i++)
    {
    nodoList[i]->displayList();	
    }
  }
